#include "app_bluetooth.h"
#include "log/log.h"
#include <string.h>
/**
* 初始化
 * 1. 将蓝牙数据的预处理方法装配给设备模块
* 2 设置设备的蓝牙默认配置，并连接蓝牙 
*/
// int app_bt_init(Device *device){
//     device->pre_write = app_bt_preWrite;
//     device->post_read = app_bt_postRead;
//     return 0;
// }

/**
* 写前预处理
{"conn_type":2,"id":"5959","msg":"61626364"}
01 02 04 59 59 61 62 63 64
AT+MESH 00 59 59 61 62 63 64
*/
int app_bt_preWrite(char *data,int len ){
    char data_buffer[256];
    int data_len=0;
    memcpy(data_buffer,"AT+MESH",8);
    data_len=8;
    int id_len=2;
    //int data_len=data[2];
    memcpy(data_buffer+data_len,data+3,id_len);
    data_len+=id_len;
    // log_info("data_buffer1:%s",data_buffer+8);
    memcpy(data_buffer+data_len,data+3+id_len,len-3-id_len);
    data_len+=len-3-id_len;
    // log_info("data_buffer2:%s",data_buffer+8);
    //+ \r\n
    memcpy(data_buffer+data_len,"\r\n",2);
    data_len+=2;
    // log_info("data_buffer3:%s",data_buffer+8);

    //clear data
    memset(data,0,len);
    memcpy(data,data_buffer,len+7);
    return len+7;
}


static char data_buffer[256];
static int data_len=0;
static char fix_header[2]={0xF1,0xDD};
/**
* 读后预处理
*/
int app_bt_postRead(char *data,int len ){
    log_info("data==========:%s",data);
    memcpy(data_buffer+data_len,data,len);
    data_len+=len;
    //data not enough wait next
    if(data_len<8){
        log_info("数据不完整,等待下一次统一处理...");

        return 0;
    }
    //check header
    for (int i = 0; i < data_len-7; i++)
    {
       if(memcmp(data_buffer+i,fix_header,2)==0){
            memmove(data_buffer,data_buffer+i,data_len-i);
            data_len=data_len-i;
            log_info("匹配上了,则删除前面所有数据...%.*s", data_len, data_buffer);
            //data len= 0xF1 0xDD 数据长度 数据
            int cur_len=data_buffer[2]+3;
            log_info("当次数据长度为%d,蓝牙数据长度为%d", data_len, cur_len);
            if(data_len<cur_len){
                log_info("当前全部变量中保存的数据不全,等待下一次一起处理...");
                return 0;
            }else{
                memset(data,0,sizeof(data));
                // data_buffer:f1 dd 07 23 23 FF FF msg
                // data: 1 2 msg_len id msg
                data[0]=1;
                data[1]=2;
                data[2]=cur_len-7;
                memcpy(data+3,data_buffer+3,2);//id
                memcpy(data+5,data_buffer+7,cur_len-7);//msg
                log_info("匹配上头数据,且数据长度足够...");
                // memmove(data_buffer,data_buffer+cur_len+i,data_len-cur_len-i);
                // data_len=data_len-cur_len-i;
                memmove(data_buffer,data_buffer+cur_len,data_len-cur_len);
                data_len=data_len-cur_len;
                // data_buffer:f1 dd 07 23 23 FF FF msg  == cur_len
                // data:01 02 03 23 23 41 42 43          == data_len
                return cur_len-2;
            }
       }
    }
    log_info("data_len:%d",data_len);
    //clear data 
    memmove(data_buffer,data_buffer+data_len-7,7);
    data_len=7;
    
    log_info("data_buffer==========:%s",data_buffer);
     
    return 0;
}


/**
* 初始化蓝牙连接
*/
static int init_bt(Device *device)
{
  // 初始串口 9600 / 阻塞
  app_serial_init(device);

  // 设置串口为非阻塞模式
  app_serial_setBlock(device, 0); 
tcflush(device->fd, TCIOFLUSH);

  // 判断蓝牙可用才去设置蓝牙属性
  if (app_bt_status(device) == 0)
  {
    // 修改蓝牙波特率
    app_bt_setBraudRate(device, BT_BAUD_115200);
    // 重置
    app_bt_reset(device);
    sleep(2); // 等待蓝牙复位
}

  // 将串口的波特率修改为115200
  app_serial_setBraudRate(device, BR_115200);
tcflush(device->fd, TCIOFLUSH);

  // 设置蓝牙的Netid/MADDR/Name
  app_bt_rename(device, "bt_tc");
  app_bt_setNetId(device, "1090");
  app_bt_setmaddr(device, "0001");
  
  // 判断蓝牙是否可用， 如果不可用则返回-1
  if (app_bt_status(device) != 0)
  {
    log_error("蓝牙初始化失败");
    return -1;
}

  // 将串口改为阻塞模式
  app_serial_setBlock(device, 1);
tcflush(device->fd, TCIOFLUSH);

  log_debug("蓝牙初始化成功");
  return 0;
}


/**
* 初始化
*/
int app_bt_init(Device *device)
{
  // 给devicel配置由蓝牙模块实现的post_read和pre_write
  device->post_read = app_bt_postRead;
  device->pre_write = app_bt_preWrite;

  // 初始化蓝牙
  init_bt(device);

  return 0;
}

/**
* 等待蓝牙模块的确认
*/
static int wait_ack(Device *device)
{
  // 注意：需要等待一定时间，因为蓝牙模块需要一定时间来处理指令
  usleep(1000*50); // 50ms

  // 从设备中读取4个字节的数据
  char buf[4];
  read(device->fd, buf, 4);
  // 如果读取的数据是“OK\r\n”则代表成功，返回0, 否则返回-1
  if (memcmp(buf, "OK\r\n", 4) == 0)
  {
    return 0;
  }
  return -1;
}

/**
* 测试蓝牙是否可用
*/
int app_bt_status(Device *device)
{
  // 向串口发送测试指令 也就是写入“AT\r\n”
  write(device->fd, "AT\r\n", 4);
  // 返回是否成功/确认的结果
  return wait_ack(device);
}

/**
* 修改蓝牙名称
*/
int app_bt_rename(Device *device, char *name)
{
  char cmd[100];
  sprintf(cmd, "AT+NAME%s\r\n", name);
  write(device->fd, cmd, strlen(cmd));

  return wait_ack(device);
}

/**
* 设置波特率
*/
int app_bt_setBraudRate(Device *device, BTBraudRate baud_rate)
{
  char cmd[100];
  sprintf(cmd, "AT+BAUD%c\r\n", baud_rate);
  write(device->fd, cmd, strlen(cmd));

  return wait_ack(device);
}

/**
* 重置(修改的配置才生效)
*/
int app_bt_reset(Device *device)
{
  write(device->fd, "AT+RESET\r\n", 10);

  return wait_ack(device);
}

/**
* 设置组网id(同一个组的多个设备组网id相同)
* net_id： 4位十六进制字符串
*/
int app_bt_setNetId(Device *device, char *net_id)
{
  char cmd[100];
  sprintf(cmd, "AT+NETID%s\r\n", net_id);
  write(device->fd, cmd, strlen(cmd));

  return wait_ack(device);
}

/**
* 设置蓝牙MAC地址(同一个组的多个设备MAC地址不同)
* maddr: 4位十六进制字符串
*/
int app_bt_setmaddr(Device *device, char *maddr)
{
  char cmd[100];
  sprintf(cmd, "AT+MADDR%s\r\n", maddr);
  write(device->fd, cmd, strlen(cmd));

  return wait_ack(device);
}